import axios from 'axios'
import { Message } from 'element-ui'
import router from '@/router'

// 创建axios实例
const service = axios.create({
  baseURL: 'http://localhost:8080', // 设置基础URL
  timeout: 60000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json'
  }
})

// 请求拦截器
service.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    console.log('发送请求:', config.url)

    // 从localStorage获取token
    const token = localStorage.getItem('token')
    console.log('当前token:', token) // 添加token日志

    if (token) {
      // 确保headers对象存在
      config.headers = config.headers || {}
      // 设置统一的Bearer Token认证头
      config.headers.Authorization = `Bearer ${token}`
      // 打印完整的请求配置
      console.log('请求配置:', {
        url: config.url,
        method: config.method,
        headers: config.headers,
        data: config.data
      })
    } else {
      // 如果没有token且不是登录或注册请求，重定向到登录页
      const publicPaths = ['/front/login', '/front/register']
      if (!publicPaths.includes(config.url)) {
        console.log('未找到token，需要重定向到登录页')
        router.push('/')
        return Promise.reject(new Error('未登录或登录已过期'))
      }
    }

    return config
  },
  error => {
    // 对请求错误做些什么
    console.error('请求错误:', error)
    return Promise.reject(error)
  }
)

// 响应拦截器
service.interceptors.response.use(
  response => {
    console.log('收到响应:', response.data)
    const res = response.data

    // 如果响应是数组，直接返回
    if (Array.isArray(res)) {
      return res
    }

    // 如果响应是标准格式
    if (typeof res === 'object') {
      // 如果返回的状态码不是200，说明接口有问题，把错误信息显示出来
      if (res.code !== 200) {
        Message({
          message: res.msg || '系统错误',
          type: 'error',
          duration: 5 * 1000
        })

        // 401: 未登录或token过期
        if (res.code === 401) {
          // 清除用户信息
          localStorage.removeItem('token')
          localStorage.removeItem('username')
          Message.error('登录已过期，请重新登录')
          // 重定向到登录页
          router.push('/')
          return Promise.reject(new Error('登录已过期，请重新登录'))
        }
        return Promise.reject(new Error(res.msg || '系统错误'))
      } else {
        // 返回完整的响应对象，包括 code 和 msg
        return res
      }
    }

    // 其他情况直接返回
    return res
  },
  error => {
    console.error('响应错误:', error)
    if (error.response) {
      switch (error.response.status) {
        case 401:
          // 清除用户信息
          localStorage.removeItem('token')
          localStorage.removeItem('username')
          Message.error('登录已过期，请重新登录')
          // 重定向到登录页
          router.push('/')
          break
        case 403:
          Message.error('没有权限访问该资源')
          break
        case 404:
          Message.error('请求的资源不存在')
          break
        case 500:
          Message.error('服务器错误，请稍后重试')
          break
        default:
          Message.error(error.message || '系统错误')
      }
    } else if (error.request) {
      Message.error('网络错误，请检查网络连接')
    } else {
      Message.error(error.message || '系统错误')
    }
    return Promise.reject(error)
  }
)

// 封装请求方法
const http = {
  get: (url, params = {}) => {
    return service({
      url,
      method: 'get',
      params
    })
  },

  post: (url, data) => {
    return service({
      url,
      method: 'post',
      data
    })
  },

  put: (url, data) => {
    return service({
      url,
      method: 'put',
      data
    })
  },

  delete: (url) => {
    return service({
      url,
      method: 'delete'
    })
  }
}

export default http